package com.kwt.learn.algorithm;

/**
 * 整数反转
 * 给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。
 * <p>
 * 如果反转后整数超过 32 位的有符号整数的范围[-2^31 , 2^31-1]，就返回 0。
 */
public class Solution02 {

    public static void main(String[] args) {
        System.err.println(reverse(-2147483648));
    }

    /**
     * 这种方式利用了long的范围比int大，并且也是整型，但是leetcode无法通过
     *
     * @param x
     * @return
     */
    public static long reverse1(long x) {
        //整体思路，利用取余数，挨个将数据反转
        long result = 0;
        while (x / 10 != 0) {
            result = result * 10 + x % 10;
            x = x / 10;
        }
        result = result * 10 + x;
        //判断
        if (result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) {
            return 0;
        }
        return result;
    }

    /**
     * 最终通过
     * <p>
     * 该题解题主要思路
     * 1、利用取模的方式得到数据反转后的序列
     * 2、利用  *10+n 的方式将n拼接到后一位
     * 3、判断结果集如果即将超出int的范围则提前 return 0
     *
     * @param x
     * @return
     */
    public static int reverse(int x) {
        //整体思路，利用取余数，挨个将数据反转
        int result = 0;
        while (x / 10 != 0) {
            result = result * 10 + x % 10;
            x = x / 10;
        }
        if (result > Integer.MAX_VALUE / 10 || result < Integer.MIN_VALUE / 10) {
            return 0;
        }
        result = result * 10 + x;
        return result;
    }
}
